/**
 * 
 * @author Joao Borrego, Nara Fanha
 * @version 07-12-2013
 */

public class Jogador {
	
	private Peao[] p;

	private int cor, iterador;
	private String nome;
	private boolean isReady;
	private boolean isVitoria;
	
	//Dado
	public static final int MAX = 6;
	public static final int MIN = 1;
	public static final int NUM_PEO = 4;
	
	
	/**
	 * Construtor da classe
	 */
	public Jogador(){
		this.iterador = -1;
		this.nome = "";
		this.isReady = false;
		this.p = new Peao[NUM_PEO];
		this.isVitoria = false;
		
		for(int x = 0; x < NUM_PEO; x++) 
		{
			p[x] = new Peao();
		}
	}
	
	
	/**
	 * Este metodo e chamado quando se esta a carregar o jogo
	 * @param nome
	 * @param isReady
	 */
	public void carregarJogador(String nome, boolean isReady) 
	{
		this.nome = nome;
		this.isReady = isReady;
	}
	
	
	/**
	 * Construtor da classe
	 * @param String nome
	 * @pre nome != ""
	 */
	public Jogador( String nome)
	{
		this.nome = nome;
		this.isReady = false;
		this.p = new Peao[NUM_PEO];
		
		for(int x = 0; x < NUM_PEO; x++) 
		{
			p[x] = new Peao();
		}
	}
	
	
	/**
	 * Este metodo devolve um peao escolhido
	 * @param peao numero do peao
	 * @return Peao
	 * @pre peao == 1
	 */
	public Peao devolvePeao(int peao)
	{
		return p[peao-1];
	}
	
	
	/**
	 * Este metodo faz o peao avancar
	 * @param casas numero de casas que o peao vai avancar
	 * @param peao numero do peao
	 * @pre 0 < dado < 7
	 */
	public void jogar(int casas, int peao) 
	{
		Peao p = devolvePeao(peao);
		
		if(!p.getJogou()) 
		{
			p.setJogou();
		}
		p.avanca(casas);
	}
	
	
	/**
	 * Este metodo devolve a cor do jogador
	 * @return int cor do jogador
	 */
	public int cor() 
	{
		return this.cor;
	}
	
	
	/**
	 * Este metodo devolve o estado de prontidao do jogador
	 * @return estado do jogador (boolean)
	 */
	public boolean isReady()
	{
		return this.isReady;
	}
	
	
	/**
	 * Muda o estado de prontidao do jogador
	 */
	public void setReady() 
	{
		this.isReady = !this.isReady;
	}
	
	
	/**
	 * Este metodo devolve o nome do jogador
	 * @return nome do jogador
	 */
	public String nome() 
	{
		return this.nome;		
	}
	
	
	/**
	 * Este metodo lanca o dado
	 * @return numero do dado
	 */
	public int lancarDado() 
	{
		return Dado.lanca(MIN, MAX);
	}
	
	
	/**
	 * Este metodo verifica se o jogador reune condicoes de vitoria ou nao
	 * @return true se todos os peoes tao na casa final, false senao
	 */
	public boolean allIn() 
	{
		boolean all = true;
		
		for(int x = 0; x < p.length && all; x++) 
		{
			all = p[x].posicao() >= LudoGUI.TRACK_LENGTH;
		}
		return all;
	}
	
	
	/**
	 * Este metodo adiciona um novo peao
	 * @param peao peao a ser introduzido
	 * @param ocupado se a casa 1 esta ocupada ou nao
	 */
	public void acrescentaPeao(int peao) 
	{
		p[peao-1].avanca(1);
	}
	
	
	/**
	 * Este metodo devolve a posicao atual de um peao
	 * @param peao peao a consultar
	 * @return posicao atual do peao
	 */
	public int getCasas(int peao)
	{
		return this.p[peao-1].posicao();
	}
	
	
	/**
	 * Este metodo devolve se o peao ja foi jogado
	 * @param peao
	 * @return
	 */
	public boolean jaJogou(int peao)
	{
		return this.p[peao-1].getJogou();
	}
	
	
	/**
	 * Inicializa o iterador
	 */
	public void startIterator() 
	{
		this.iterador = 0;
	}
	
	
	/**
	 * Este metodo indica se existe algum peao a ser jogado
	 * quando chega ao fim da travessia, devolve false, caso contrario devolve true
	 * @return
	 */
	public boolean hasNext() 
	{
		return this.iterador < Main.NUM_PEO && this.iterador > -1;
	}
	
	
	/**
	 * Este metodo devolve o peao actual
	 * @pre hasNext()
	 * @return peao
	 */
	public Peao next() 
	{
		return this.p[this.iterador++];
	}
	
	/**
	 * Este metodo verifica se o jogador ja terminou o jogo
	 * @return
	 */
	public boolean getVitoria() 
	{
		return isVitoria;
	}
	
	/**
	 * Este metodo muda o estado de vitoria do jogador para true
	 */
	public void setVitoria() 
	{
		isVitoria = true;
	}
	
}
